#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：idi_mes 
@File    ：output_singleroll.py
@IDE     ：PyCharm 
@Date    ：10/31/24 11:00 AM 
"""
from typing import Dict, Union

from mg_app_framework import MesCode, get_organization

from common.basic_mongo import get_mongo_collection
from common.retrospect_operate.handle import filter_device_code_workorder_config
from prod_ctrl_service.tool.tool import (get_time, calculate_feeding_material_qty_036_060)

"""本接口的流程逻辑： 基础校验、工单是否生产、BOm配置，这三项校验通过后，以类似036的逻辑进行扣料操作"""


async def check_output_singkleroll(params: Dict[str, Union[str, int]]) -> Dict[str, Union[str, Dict]]:
    """
    卷绕工序单卷时，将单卷数据发送给MES进行原材料扣料。正极单卷和负极单卷需要分别调用
    :param params: {
                    "call_id":"JQ00386",  #接口调用方认证ID, string
                    "trace_id":"8941d16b-0581-4e68-8940-a651afff4282",  #接口调用ID, string
                    "upperpc_code": "UP011",    #上位机编码, string
                    "user_code":"Y001",  #员工编码, string
                    "equip_code":"ZP001",  # 设备编码, string
                    "process_code":"2050",   # 工序编码, string, 必输
                    "src_wip_type": 0，# 正负极卷料类型 int     Y   0：正极 1：负极
                    "src_wip_no": "C241020-2-1-1-1-2",  # 正负极卷料码 string      Y   正极传正极卷料码、负极传负极卷料码
                    "src_up_septum": "PPT202408140056",  # 上隔膜原料码   string      Y   上隔膜原料码
                    "src_down_septum": "WW202408140001",  # 下隔膜原料码   string      Y   上隔膜原料码
                    "src_tape": "T202408270980",  # 胶带原料码   string      Y   胶带原料码
                    "singleroll_cnt": 1   # 单卷数量    int     Y   默认传1，多个单卷时，上传实际单卷数量
            }
    :return:
    """
    error_msg = ""
    equip_code = params.get("equip_code")
    workorder_config = await filter_device_code_workorder_config(device_code=equip_code)
    workorder_status = workorder_config.workorder_status
    if workorder_status != "on_work":
        error_msg += f"当前工序无生产中工单;"
    bom_info = workorder_config.bom_info
    if not bom_info.product_out or not bom_info.product_in:
        error_msg += f"设备{equip_code}的BOM信息未配置完整;"
    if error_msg:
        result = {
            "code": MesCode.fail,  # 接口应答状态代码, success：成功; fail：失败, string
            "data": {},  # 接口返回结果描述, json数组, 本接口不需要返回数据，返回null
            "info": error_msg,
        }
        return result
    process_code = params.get("process_code")
    src_wip_type = params.get("src_wip_type")
    src_wip_no = params.get("src_wip_no")
    src_up_septum = params.get("src_up_septum")
    src_down_septum = params.get("src_down_septum")
    src_tape = params.get("src_tape")
    singleroll_cnt = params.get("singleroll_cnt")

    # 从bom信息获取本工序投入物料中code-type分类是批次码的物料及其扣减数量
    material_code_material_quota_map = {}
    for product_in_bom_info in bom_info.product_in:
        if product_in_bom_info.code_type == "batch_code":
            material_code = product_in_bom_info.material_code
            material_quota = product_in_bom_info.material_quota
            if material_code in material_code_material_quota_map:
                material_code_material_quota_map[material_code] += material_quota * singleroll_cnt
            else:
                material_code_material_quota_map.update({material_code: material_quota * singleroll_cnt})
    # 进行扣料操作
    code_list = [src_wip_no, src_up_septum, src_down_septum, src_tape]
    await calculate_feeding_material_qty_036_060(
        material_code_quota_map=material_code_material_quota_map,
        process_code=process_code,
        equip_code=equip_code,
        code_list=code_list
    )

    data = {
        "call_id": params.get("call_id"),  # 接口调用方认证ID, string
        "trace_id": params.get("trace_id"),  # 接口调用ID, string
        "upperpc_code": params.get("upperpc_code"),  # 上位机编码, string
        "user_code": params.get("user_code"),  # 员工编码, string
        "equip_code": params.get("equip_code"),  # 设备编码, string
        "process_code": params.get("process_code"),  # 工序编码, string
        "src_wip_type": src_wip_type,  # 正负极卷料类型 int     Y   0：正极 1：负极
        "src_wip_no": src_wip_no,  # 正负极卷料码 string      Y   正极传正极卷料码、负极传负极卷料码
        "src_up_septum": src_up_septum,  # 上隔膜原料码   string      Y   上隔膜原料码
        "src_down_septum": src_down_septum,  # 下隔膜原料码   string      Y   上隔膜原料码
        "src_tape": src_tape,  # 胶带原料码   string      Y   胶带原料码
        "singleroll_cnt": singleroll_cnt,  # 单卷数量    int     Y   默认传1，多个单卷时，上传实际单卷数量
        "time": get_time()
    }
    await insert_data(data=data)

    result = {
        "code": MesCode.success,  # 接口应答状态代码, success：成功; fail：失败, string
        "data": {},  # 接口返回结果描述, json数组, 本接口不需要返回数据，返回null
        "info": "OK",  # 接口返回信息描述, 如果为fail, 则为fail的异常描述信息, string
    }
    return result


async def insert_data(data):
    """
    登记按电芯提交电芯状态(OK, NG)
    :param data:
    :return:
    """
    collection = get_mongo_collection(
        database_name=f"{get_organization()}_mes",
        collection_name=f"output_singleroll_record",
    )
    await collection.insert_one(data)
